<?php
/**
 * 유틸리티 - INI 관리
 *
 * INI 파일을 읽어오는 기능과 쓰는 기능을 가지고 있습니다.
 *
 * <code>
 * <?php
 * $utilIni = utilIni::getInstance();
 *
 * //파일불러오기
 * $aFileData = $utilIni->load('test.ini');
 *
 * //파일저장하기
 * $aData['bar'] = array(
 *    'foo' => 'test',
 *    'key' => 'value'
 * );
 * $utilIni->save('test2.ini', $aData);
 * ?>
 * </code>
 *
 * @package     util
 *
 * @author      ulariul jung
 * @version     1.0
 */

class utilIni
{
    private static $instance;
    private $aData;

    public static function getInstance()
    {
        if (!self::$instance instanceof utilIni) {
            self::$instance = new utilIni;
        }
        return self::$instance;
    }

    /**
     * ini parse
     *
     * 파서된 결과를 array로 리턴합니다.
     *
     * <code>
     * <?php
     * $utilIni = utilIni::getInstance();
     *
     * //파일불러오기
     * $aFileData = $utilIni->load('test.ini');
     * print_r($aFileData);
     * ?>
     * </code>
     *
     * @param   String  $sFile    INI 파일
     *
     * @return  Array   파서된 결과
     */
    public function load($sFile)
    {
        if (!file_exists($sFile)) {
            throw new exceptionFile_not_found($sFile .' is not found');
        }
        return parse_ini_file($sFile, true);
    }


    /**
     * to save ini
     *
     * <code>
     * <?php
     * $utilIni = utilIni::getInstance();
     * //파일저장하기
     * $aData['bar'] = array(
     *    'foo' => 'test',
     *    'key' => 'value'
     * );
     * $utilIni->save('test2.ini', $aData);
     * ?>
     * </code>
     *
     * @param   String  $sFile  INI 파일
     * @param   Array   $aData  2차원 배열
     *
     * @return  Boolean    true | false
     *
     */
    public function save($sFile, $aData)
    {
        $sContent = '';

        foreach ($aData as $sSec => $aSectionData) {
            $sContent .= '[' . $sSec . "]\n";
            $sContent .= $this->makeSectionData($aSectionData);
        }

        $utilFile = utilFile::getInstance();
        $mData = $utilFile->write($sFile, $sContent, FILE_MODE_WRITE);

        return (strlen($sContent) == $mData);
    }


    /**
     * 섹션 데이터 작성
     *
     * @param   Array    $aSectionData
     *
     * @return    String
     */
    private function makeSectionData($aSectionData)
    {
        $sSectionContent = '';
        foreach ($aSectionData as $sKey => $sVal) {
            $sSectionContent .= $sKey . ' = ' .  (is_numeric($sVal) ? $sVal : '"'.$sVal.'"')."\n";
        }

        return $sSectionContent;
    }
}
